from django.http import JsonResponse
from django.shortcuts import redirect
from django.core.cache import cache
import requests
from django.contrib.auth.models import User
from game.models.player.player import Player
from random import randint


def receive_code(request):
    data = request.GET

    if 'errorcode' in data:
        JsonResponse({
            'result':'apply failed',
            'errorcode':data['errorcode'],
            'errmsg':data['errmsg'],
            })
    code = data.get('code')
    state = data.get('state')
    
    print(str(state))
    if not cache.has_key(state):
        return JsonResponse({
                'result':"state not exist"
            })

    cache.delete(state)

    apply_access_token_url = "https://www.acwing.com/third_party/api/oauth2/access_token/"

    params = {
        'appid': "1397",
        'secret': "6153f2baa6ac4259ba7bf8b0eb0d113b",
        'code':code
    }

    access_token_res = requests.get(apply_access_token_url , params = params).json()

    access_token = access_token_res['access_token']
    openid = access_token_res['openid']

    players = Player.objects.filter(openid=openid)

    if players.exists():      # 如果该用户已存在
        player = players[0]
        return JsonResponse({
            'result':"success",
            'username':player.user.username,
            'photo':player.photo
            })
    get_userinfo_url = "https://www.acwing.com/third_party/api/meta/identity/getinfo/"

    params = {
        'access_token': access_token,
        'openid':openid
    }
    userinfo_res = requests.get(get_userinfo_url, params=params).json()

    username = userinfo_res['username']
    photo = userinfo_res['photo']
    
    while User.objects.filter(username=username).exists():  # 找到一个不同的用户名
        username += str(randint(0,9))

    user = User.objects.create(username=username)
    player = Player.objects.create(user=user,photo=photo,openid=openid)

    login(request, user)
    return JsonResponse({
        'result':"success",
        'username':player.user.username,
        'photo':player.photo
     })
